package com.meritit.portal.login.web;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.meritit.portal.util.DateUtils;
import com.meritit.portal.util.Encrypt;
import com.meritit.portal.util.MD5;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 检查用户请求合法性的校验类 即使某个用户知道该模块中的访问地址，但也必须只能用自己的身份来查看数据。
 * 从企业门户中访问该模块时必须提供用户的门户账号ID和token（用户身份串），token是对门户账号编码后的字符串。
 * 用户的门户账号ID经过编码后必须跟token保持一致，否则为非法，拒绝访问资源。
 * 
 * @author miaoyu
 * @since 2011-10-11
 */
public class ALogin extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private Logger log = Logger.getLogger(ALogin.class);

	/**
	 * 验证用户身份的合法性，如果不合法则拒绝访问。
	 * 
	 * @return
	 * @throws Exception
	 */
	public String login() throws Exception {
		try {
			HttpServletRequest request = ServletActionContext.getRequest();
			String action = request.getParameter("act");
			// 验证用户请求的合法性
			if (!validateUserRequest(request)) {
				return "Refuse";
			} else if (action == null || "".equals(action)) {
				return "Refuse";
			}
			return action;
		} catch (Exception e) {
			log.error("错误信息:" + e.getMessage());
			throw e;
		}
	}

	/**
	 * 验证用户请求的合法性，包括请求是否包含用户ID，用户身份串是否合法，同时初始化皮肤路径。
	 * 
	 * @param request
	 * @return 合法：true，非法：false
	 * @throws Exception
	 */
	private boolean validateUserRequest(HttpServletRequest request)
			throws Exception {
		String userId = request.getParameter("userId");
		String token = request.getParameter("token");
		String currDate = DateUtils.getCurrDateStr();
		// 验证是否包含用户ID
		if (userId == null || "".equals(userId)) {
			return false;
		}
		String userToken = MD5.getDigestedString(userId + currDate);
//		System.out.println(userToken);
		// 验证用户身份串是否合法
		if (token == null || "".equals(token)) {
			return false;
		} else if (!userToken.equals(token)) {
			return false;
		}
		String userNewId = Encrypt.encrypt(currDate, userId);
		request.setAttribute("userId", userNewId);
		return true;
	}
}
